const express = require('express');
const { authenticateToken } = require('../middleware/auth');
const axios = require('axios');
const db = require('../config/db');
const router = express.Router();

// 通义千问API配置
const QWEN_API_KEY = process.env.QWEN_API_KEY || 'your_api_key_here';
const QWEN_API_URL = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation';

// 免费AI服务配置（使用Hugging Face的免费模型）
const FREE_AI_API_URL = 'https://api-inference.huggingface.co/models/gpt2';
const FREE_AI_API_KEY = process.env.FREE_AI_API_KEY || 'your_free_api_key_here';

// 打印API密钥信息（仅用于调试，生产环境中应删除）
console.log('QWEN_API_KEY loaded:', QWEN_API_KEY ? 'YES' : 'NO');
console.log('QWEN_API_KEY length:', QWEN_API_KEY ? QWEN_API_KEY.length : 0);

// 获取系统状态信息
router.get('/ai/system-status', authenticateToken, async (req, res) => {
  try {
    // 获取未读消息数量
    // 首先检查是否有未指定接收者的全局消息
    const [globalUnreadMessagesResult] = await db.execute(
      'SELECT COUNT(*) as count FROM messages WHERE receiver_id IS NULL AND status = "unread"'
    );
    const globalUnreadMessagesCount = globalUnreadMessagesResult[0]?.count || 0;
    
    // 然后检查当前用户的未读消息
    const [userUnreadMessagesResult] = await db.execute(
      'SELECT COUNT(*) as count FROM messages WHERE receiver_id = ? AND status = "unread"',
      [req.user.id]
    );
    const userUnreadMessagesCount = userUnreadMessagesResult[0]?.count || 0;
    
    // 总未读消息数 = 全局未读消息 + 用户未读消息
    const unreadMessagesCount = globalUnreadMessagesCount + userUnreadMessagesCount;
    
    // 获取待处理文件数量
    // files表中没有status字段，暂时返回0
    const pendingFilesCount = 0;
    
    // 获取活跃工作流数量
    // 暂时返回0，避免查询不存在的字段
    const activeWorkflowsCount = 0;
    
    res.json({
      code: 200,
      message: 'success',
      data: {
        unreadMessagesCount,
        globalUnreadMessagesCount,
        userUnreadMessagesCount,
        pendingFilesCount,
        activeWorkflowsCount
      }
    });
  } catch (error) {
    console.error('获取系统状态失败:', error);
    // 即使获取系统状态失败，也要返回默认值而不是500错误
    res.json({
      code: 200,
      message: 'success',
      data: {
        unreadMessagesCount: 0,
        globalUnreadMessagesCount: 0,
        userUnreadMessagesCount: 0,
        pendingFilesCount: 0,
        activeWorkflowsCount: 0
      }
    });
  }
});

// AI对话接口（集成通义千问API）
router.post('/ai/chat', authenticateToken, async (req, res) => {
  try {
    const { message, context } = req.body;
    
    // 参数验证
    if (!message) {
      return res.status(400).json({
        code: 400,
        message: '消息内容不能为空'
      });
    }
    
    // 调用通义千问API
    const aiResponse = await callQwenAPI(message, context, req.user);
    
    res.json({
      code: 200,
      message: 'success',
      data: {
        reply: aiResponse
      }
    });
  } catch (error) {
    console.error('AI对话失败:', error);
    res.status(500).json({
      code: 500,
      message: '服务器内部错误'
    });
  }
});

// 调用通义千问API
// 生成系统提示词
function getSystemPrompt(context = {}, user = {}) {
  let systemPrompt = '你是一个专业的助手，正在帮助用户使用一个后台管理系统。这个系统包含以下功能模块：用户管理、消息管理、文件管理、工作流引擎等。请根据用户的问题提供准确、有用的回答。';
  
  // 添加用户角色信息
  if (user.role) {
    systemPrompt += `\n当前用户角色：${user.role === 'admin' ? '管理员' : '普通用户'}`;
  }
  
  // 添加上下文信息
  if (context.unreadMessagesCount !== undefined && context.unreadMessagesCount > 0) {
    systemPrompt += `\n重要提醒：用户当前有 ${context.unreadMessagesCount} 条未读消息`;
    
    // 如果有全局消息，特别说明
    if (context.globalUnreadMessagesCount > 0) {
      systemPrompt += `，其中包含 ${context.globalUnreadMessagesCount} 条全局消息`;
    }
    
    systemPrompt += `，建议用户及时查看消息中心处理这些消息。`;
  } else if (context.unreadMessagesCount === 0) {
    systemPrompt += `\n用户当前没有未读消息。`;
  }
  
  if (context.pendingFilesCount !== undefined && context.pendingFilesCount > 0) {
    systemPrompt += `\n系统中有 ${context.pendingFilesCount} 个待处理文件。`;
  }
  
  if (context.activeWorkflowsCount !== undefined && context.activeWorkflowsCount > 0) {
    systemPrompt += `\n当前有 ${context.activeWorkflowsCount} 个活跃的工作流。`;
  }
  
  return systemPrompt;
}

async function callQwenAPI(message, context = {}, user = {}) {
  try {
    // 检查API密钥
    if (!QWEN_API_KEY || QWEN_API_KEY === 'your_api_key_here') {
      console.warn('警告: 未配置有效的通义千问API密钥');
      return '抱歉，系统未配置AI服务密钥。请联系系统管理员配置API密钥。';
    }
    
    // 打印调试信息
    console.log('调用通义千问API:', { 
      url: QWEN_API_URL, 
      hasApiKey: !!QWEN_API_KEY,
      apiKeyLength: QWEN_API_KEY.length
    });
    
    const response = await axios.post(QWEN_API_URL, {
      model: 'qwen-max',
      input: {
        messages: [
          {
            role: 'system',
            content: getSystemPrompt(context, user)
          },
          {
            role: 'user',
            content: message
          }
        ]
      },
      parameters: {
        max_tokens: 1000,
        temperature: 0.7,
        top_p: 0.8
      }
    }, {
      headers: {
        'Authorization': `Bearer ${QWEN_API_KEY}`,
        'Content-Type': 'application/json'
      },
      timeout: 30000 // 30秒超时
    });
    
    // 打印响应状态
    console.log('API响应状态:', response.status);
    
    // 解析API响应
    if (response.data && response.data.output && response.data.output.text) {
      const reply = response.data.output.text;
      console.log('AI回复内容长度:', reply.length);
      return reply;
    } else {
      console.error('API响应格式不正确:', response.data);
      return '抱歉，AI服务返回了意外的响应格式。请稍后再试。';
    }
  } catch (error) {
    console.error('调用通义千问API失败:', error.message);
    if (error.response) {
      console.error('API错误响应:', error.response.status, error.response.data);
      return `AI服务返回错误 (${error.response.status}): ${error.response.data?.message || '未知错误'}`;
    } else if (error.request) {
      console.error('网络错误，无法连接到AI服务:', error.message);
      return '抱歉，无法连接到AI服务。可能是网络问题或服务暂时不可用。';
    } else {
      console.error('请求配置错误:', error.message);
      return '抱歉，AI服务请求配置错误。请联系系统管理员。';
    }
  }
}

module.exports = router;